Isotope Dendrochronology
Mechanistic model of the Oxygen isotopes in cellulose.
COURSE: DISC, LTRR, UNIVERSITY OF ARIZONA. INSTRUCTORS: P. SZEJNER & S. BELMECHERI
The following code and comments should further your experience of using tree ring and Oxygen isotopes in cellulose using R. This exercise relies upon estimations and measurements of the different factors that determine the oxygen isotopes in the cellulose that we can date in tree rings. The following calculations will be relying on the use of the Craig Gordon model, and the Roden model.
Craig H, Gordon L (1965) Deuterium and oxygen 18 variations in the ocean and the marine atmosphere. In: Tongiorgi E (ed) Stable Isotopes in Oceanographic Studies and Paleotemperatures. Consiglio Nazionale delle ricerche Laboratorio di Geologia Nucleare. Pisa, Spoleto, Italy, pp 9–130).
Roden J, Lin G, Ehleringer JR (2000) A mechanistic model for interpretation of hydrogen and oxygen isotope ratios in tree-ring cellulose. Geochim Cosmochim Acta 64:21–35. https://doi.org/10.1016/S0016-7037(99)00195-7
When it comes to stable Oxygen isotopes in cellulose (δ18Ocell), three dominant factors will contribute to how the δ18Ocell is recorded in tree rings. These three factors are;
1. The isotopic content of the source water.
2. The leaf evaporative enrichment effect.
3. The proportion of phloem sugars that exchange with source water during cellulose formation.
The signal of these three processes is integrated into the cambium during xylogenesis.
The source of Oxygen in plants is coming from the water. In the following exercise, we will implement a mechanistic model in which we will follow the isotopic fractionation processes in which the isotopic ratios from the main molecules involved in cellulose formation are modified and fixed. And how this can be useful in tree-ring research.
I this exercise, you will model 3 different isotopic ratios in cellulose for diferente environmental conditions. First, we will model the δ18Ocell from one environment with a sharp seasonal change like in the Southwestern US with a cool spring with moisture availability from the snowpack, followed by a pre-summer drought period, ending with a humid monsoon season during summer. Therefore, the relative humidity can progress from 50% (spring) to 30% (pre-summer drought) to 60%(monsoon) along these three seasonal periods, the temperatures will vary from 25, 33, 27 Celsius and the isotopic source water will, in this excesrise remain constant at -8 permil. at the end of the excersise you will will compare these modeled results with real measurements in tree rings form the South west where the trees are exposed to the kind of variations in relative humidity.
PART 1: Oxygen isotopes from the source water.
In this document, the “source water” will be the isotopic ratio that the plants transport through the xylem up to the leaves. Thus, it is the starting point in which the isotopic effects will be recorded during all the steps. Hence, the importance of having a good estimation or measurement of it.
rr
#the isotopic values in diferent notations
Source_18O <- -8 # This value will be our source water and will remain constant at -8 permill rsmow <- 0.0020052 # Oxygen Isotope ratio from STANDARD SMOV Rsource= rsmow*(1+Source_18O/1000) # conversion to the Ratio with no standardization.
Estimation of the isotopic value of the water vapor asuming equilibrium between atmospheric vapor and source water! remember to modify these values to the variability form the text above
temperature <- c(40, 40, 40) # temp in celsius ###########
#summary of what is below! water_vapor = Source+(isotopic effect from the fase change under equilibrium and have to convert the temperature in Kalvin (273.15),… so we are on top of what is going on) water_vapor <-Source_18O +(-1(1.137(1000000/((temperature+273.15)^2))-0.4156*((1000/(temperature+273.15))-2.0667)))
#R atm Oxy isotope ratio, atmosph water vapor Rwater_vapor= rsmow*(1+water_vapor/1000) #note! I need help on figuring out this!
PART 2: leaf water isotopic enrichment
Now that we have our source water and estimate the water vapor, then, we can focus on what will happen to this water at the leaf during transpiration.
The leaf water isotopic enrichment can be estimated using the Craig Gordon model of leaf water enrichment. This is because isotope values in the water inside the leaf are exposed to evaporation. The isotopic values of the reminding water inside the leaf will have a different isotopic value from the source value. This process will be highly dependent on the relative humidity, and we can apply the Craig Gordon model to estimate the isotopic values at the leaf level under certain relative humidity temperatures and stomatal conductance.
rr #Constants
br = boundary layer conductance. (mol m-2 s-1)
br <-1 #considered reasonable value between 0.02 to 3 in Roden paper boundary layer resistance
ak <- 1.0285 # alpha_kappa, Kinetic Fractionation akb <- 1.0189 # alpha_kappa_beta, Kinetic Fractionation boundary layer
barometric pressure (mmbar)
press_bar <- 77 #a good site average is 77.5 according to W, This need to be changed for the pressure level
Here we asume that the vapor is saturated inside the leaf and we apply this formula tu calculate the vapor presure when saturated (Rh=100%) at the temperature we best estimate the plant is and call it “ei”.
rr
ei <- (101325exp((((-0.1299(1-(373.16/(273.15 + temperature)))-0.6445)(1-(373.16/(273.15 + temperature)))-1.976)(1-(373.16/(273.15 + temperature)))+13.3185)*(1-(373.16/(273.15 + temperature)))))/1000
#wi, leaf water vapor, converted to mole fraction wi=ei/press_bar
#ea ambient vapor pressure (kPa) ea_v <- (Relative_humidity/100)*ei
#wa, ambient water vapor, mole fraction wa_v= ea_v/press_bar
VPD in (kPa)
vpd =ei-ea_v round(vpd, digits=4 )
Here we can see the differences in Vapour presure defficity along these three times during the growing season.
rr #Total Conductance in mol g = 1/(1/Stomatal_conductance + 1/br) # or 1/(rs+rb)
E leaf transpiration (mol m-2 s-1) # barbour 2004
E_v_gs <- (wi-wa_v)*g
#ws, leaf surface water vapor, mole frac Roden 2000, Ball (1987), ws_v_gs <- ((Stomatal_conductancewi)-E_v_gs(1-wi/2))/(Stomatal_conductance - E_v_gs/2)
es vapor pressure at leaf surface (kPa) higher pressure than the atmosphere
esl_v_gs <- ws_v_gs*press_bar
round(esl_v_gs, digits = 2) round(ea_v, digits=2)
Lets recall some values that we already have estimated that will be important to keep track and estimate the expectation on the leaf water enrichment:
Rsource Source water
Rwater_vapor isotopic value of the water vapor
ei Water vapor presure saturated inside the leaf
ea_v Water vapor pressure atmosphere
esl_v_gs Water vapor pressure at leaf surface
And some constants like alpha_kappa, Kinetic Fractionation and alpha_kappa_beta, Kinetic Fractionation boundary layer
rr ak <- 1.0285 # alpha_kappa, Kinetic Fractionation akb <- 1.0189 # alpha_kappa_beta, Kinetic Fractionation boundary layer
here we estimate the Leaf water enrichment:
Rleaf_v <- alpha_star((akRsource ((ei-esl_v_gs)/ei))+ (akbRsource (esl_v_gs-ea_v)/ei)+ (Rwater_vaporea_v/ei))
Rleaf_v now the leaf qwater is estimated in terms of R and we must convert this value on permill in rsmow Oxygen Isotope ratio from STANDARD SMOV
Recall
rsmow <- 0.0020052 # we started on a value of -10 permil now after the evaporative enrichment the leaf water has moverd from -10 to 5 permil leaf_water_18O <- ((Rleaf_v/rsmow)-1)*1000 round(leaf_water_18O, digits = 2)
PART 3: isotopic signal in the Cellulose
Isotopic fractionation during sugar synthesis and mixing during cellulose synthesis.
Now, after we know the water where the sugars are made and transported in the phloem, we can use the leaf water and the Source_18O to estimate the result on the cellulose, take into consideration that during cellulose synthesis, the source water will have some influence on the result, and we usually use a 42 percent exchange.
rr # Now after we know the water where the sugars are made and trasported in the floem we can use the leaf water and the Source_18O to estimate the end result on the cellulose, take in consideration that during cellulose sinthesisi the source water will have some influence on the end result. and we usualy use a 42 percent exchange # and some constants
epsilon_s <- 27 #Autotrophic fractionation Sucrose epsilon_c <- 27 # Autotrophic fractionation Cellulose ## 0.0084Tmin.ts^2-0.51Tmin.ts+ 33.172 F_0 <- 0.42 # proportion of source water used during cellulose sinthesys
cellulose_d18O= F_0(Source_18O + epsilon_c) + (1 - F_0) (leaf_water_18O+ epsilon_s)
PART 4: Comparison between modeled data and observations
your estimations for the callulose oxygen Isotopes are:
rr round(cellulose_d18O, digits = 2)
your estimations for the leaf water oxygen Isotopes are:
rr round(leaf_water_18O, digits = 2)
Comparison between modeled data and observations,
Now with these values that you comared write down your observations differences and similarities between the modeled data in this excersise and the measurements shown in the figure 2 above.
How do you think this tool is useful?
What are the constrains or difficulties on impleenting this model for reliable analysis?
Good luck!
LS0tCnRpdGxlOiAiT3h5Z2VuIElzb3RvcGVzIGluIGNlbGx1bG9zZSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQojIyMjIyAgSXNvdG9wZSBEZW5kcm9jaHJvbm9sb2d5CiMjIyMjICBNZWNoYW5pc3RpYyBtb2RlbCBvZiB0aGUgT3h5Z2VuIGlzb3RvcGVzIGluIGNlbGx1bG9zZS4KIyMjIyMgIENPVVJTRTogRElTQywgTFRSUiwgVU5JVkVSU0lUWSBPRiBBUklaT05BLiBJTlNUUlVDVE9SUzogUC4gU1pFSk5FUiAmIFMuIEJFTE1FQ0hFUkkKClRoZSBmb2xsb3dpbmcgY29kZSBhbmQgY29tbWVudHMgc2hvdWxkIGZ1cnRoZXIgeW91ciBleHBlcmllbmNlIG9mIHVzaW5nIHRyZWUgcmluZyBhbmQgT3h5Z2VuIGlzb3RvcGVzIGluIGNlbGx1bG9zZSB1c2luZyBSLiBUaGlzIGV4ZXJjaXNlIHJlbGllcyB1cG9uIGVzdGltYXRpb25zIGFuZCBtZWFzdXJlbWVudHMgb2YgdGhlIGRpZmZlcmVudCBmYWN0b3JzIHRoYXQgZGV0ZXJtaW5lIHRoZSBveHlnZW4gaXNvdG9wZXMgaW4gdGhlIGNlbGx1bG9zZSB0aGF0IHdlIGNhbiBkYXRlIGluIHRyZWUgcmluZ3MuIFRoZSBmb2xsb3dpbmcgY2FsY3VsYXRpb25zIHdpbGwgYmUgcmVseWluZyBvbiB0aGUgdXNlIG9mICB0aGUgQ3JhaWcgR29yZG9uIG1vZGVsLCBhbmQgdGhlIFJvZGVuIG1vZGVsLgoKCkNyYWlnIEgsIEdvcmRvbiBMICgxOTY1KSBEZXV0ZXJpdW0gYW5kIG94eWdlbiAxOCB2YXJpYXRpb25zIGluIHRoZSBvY2VhbiBhbmQgdGhlIG1hcmluZSBhdG1vc3BoZXJlLiBJbjogVG9uZ2lvcmdpIEUgKGVkKSBTdGFibGUgSXNvdG9wZXMgaW4gT2NlYW5vZ3JhcGhpYyBTdHVkaWVzIGFuZCBQYWxlb3RlbXBlcmF0dXJlcy4gQ29uc2lnbGlvIE5hemlvbmFsZSBkZWxsZSByaWNlcmNoZSBMYWJvcmF0b3JpbyBkaSBHZW9sb2dpYSBOdWNsZWFyZS4gUGlzYSwgU3BvbGV0bywgSXRhbHksIHBwIDnigJMxMzApLgoKClJvZGVuIEosIExpbiBHLCBFaGxlcmluZ2VyIEpSICgyMDAwKSBBIG1lY2hhbmlzdGljIG1vZGVsIGZvciBpbnRlcnByZXRhdGlvbiBvZiBoeWRyb2dlbiBhbmQgb3h5Z2VuIGlzb3RvcGUgcmF0aW9zIGluIHRyZWUtcmluZyBjZWxsdWxvc2UuIEdlb2NoaW0gQ29zbW9jaGltIEFjdGEgNjQ6MjHigJMzNS4gaHR0cHM6Ly9kb2kub3JnLzEwLjEwMTYvUzAwMTYtNzAzNyg5OSkwMDE5NS03CgogCgpXaGVuIGl0IGNvbWVzIHRvIHN0YWJsZSBPeHlnZW4gaXNvdG9wZXMgaW4gY2VsbHVsb3NlICjOtDE4T2NlbGwpLCB0aHJlZSBkb21pbmFudCBmYWN0b3JzIHdpbGwgY29udHJpYnV0ZSB0byBob3cgdGhlIM60MThPY2VsbCBpcyByZWNvcmRlZCBpbiB0cmVlIHJpbmdzLiBUaGVzZSB0aHJlZSBmYWN0b3JzIGFyZTsgIAoxLiBUaGUgaXNvdG9waWMgY29udGVudCBvZiB0aGUgc291cmNlIHdhdGVyLiAgCjIuIFRoZSBsZWFmIGV2YXBvcmF0aXZlIGVucmljaG1lbnQgZWZmZWN0LiAgIAozLiBUaGUgcHJvcG9ydGlvbiBvZiBwaGxvZW0gc3VnYXJzIHRoYXQgZXhjaGFuZ2Ugd2l0aCBzb3VyY2Ugd2F0ZXIgZHVyaW5nIGNlbGx1bG9zZSBmb3JtYXRpb24uICAgCgpUaGUgc2lnbmFsIG9mIHRoZXNlIHRocmVlIHByb2Nlc3NlcyBpcyBpbnRlZ3JhdGVkIGludG8gdGhlIGNhbWJpdW0gZHVyaW5nIHh5bG9nZW5lc2lzLgoKVGhlIHNvdXJjZSBvZiBPeHlnZW4gaW4gcGxhbnRzIGlzIGNvbWluZyBmcm9tIHRoZSB3YXRlci4gSW4gdGhlIGZvbGxvd2luZyBleGVyY2lzZSwgd2Ugd2lsbCBpbXBsZW1lbnQgYSBtZWNoYW5pc3RpYyBtb2RlbCBpbiB3aGljaCB3ZSB3aWxsIGZvbGxvdyB0aGUgaXNvdG9waWMgZnJhY3Rpb25hdGlvbiBwcm9jZXNzZXMgaW4gd2hpY2ggdGhlIGlzb3RvcGljIHJhdGlvcyBmcm9tIHRoZSBtYWluIG1vbGVjdWxlcyBpbnZvbHZlZCBpbiBjZWxsdWxvc2UgZm9ybWF0aW9uIGFyZSBtb2RpZmllZCBhbmQgZml4ZWQuIEFuZCBob3cgdGhpcyBjYW4gYmUgdXNlZnVsIGluIHRyZWUtcmluZyByZXNlYXJjaC4gCgpJIHRoaXMgZXhlcmNpc2UsIHlvdSB3aWxsIG1vZGVsIDMgZGlmZmVyZW50IGlzb3RvcGljIHJhdGlvcyBpbiBjZWxsdWxvc2UgZm9yIGRpZmVyZW50ZSAgZW52aXJvbm1lbnRhbCBjb25kaXRpb25zLiBGaXJzdCwgd2Ugd2lsbCBtb2RlbCB0aGUgzrQxOE9jZWxsIGZyb20gb25lIGVudmlyb25tZW50IHdpdGggYSBzaGFycCBzZWFzb25hbCBjaGFuZ2UgbGlrZSBpbiB0aGUgU291dGh3ZXN0ZXJuIFVTIHdpdGggYSBjb29sIHNwcmluZyB3aXRoIG1vaXN0dXJlIGF2YWlsYWJpbGl0eSBmcm9tIHRoZSBzbm93cGFjaywgZm9sbG93ZWQgYnkgYSBwcmUtc3VtbWVyIGRyb3VnaHQgcGVyaW9kLCAgZW5kaW5nIHdpdGggYSBodW1pZCBtb25zb29uIHNlYXNvbiBkdXJpbmcgc3VtbWVyLiAgVGhlcmVmb3JlLCB0aGUgcmVsYXRpdmUgaHVtaWRpdHkgY2FuIHByb2dyZXNzIGZyb20gNTAlIChzcHJpbmcpIHRvIDMwJSAocHJlLXN1bW1lciBkcm91Z2h0KSB0byA2MCUobW9uc29vbikgYWxvbmcgdGhlc2UgdGhyZWUgc2Vhc29uYWwgcGVyaW9kcywgdGhlIHRlbXBlcmF0dXJlcyB3aWxsIHZhcnkgZnJvbSAyNSwgMzMsIDI3IENlbHNpdXMgIGFuZCB0aGUgaXNvdG9waWMgc291cmNlIHdhdGVyIHdpbGwsIGluIHRoaXMgZXhjZXNyaXNlICByZW1haW4gY29uc3RhbnQgYXQgLTggcGVybWlsLiBhdCB0aGUgZW5kIG9mIHRoZSBleGNlcnNpc2UgeW91IHdpbGwgd2lsbCBjb21wYXJlIHRoZXNlIG1vZGVsZWQgcmVzdWx0cyB3aXRoICByZWFsIG1lYXN1cmVtZW50cyAgaW4gdHJlZSByaW5ncyBmb3JtIHRoZSBTb3V0aCB3ZXN0IHdoZXJlIHRoZSB0cmVlcyBhcmUgZXhwb3NlZCB0byB0aGUga2luZCBvZiB2YXJpYXRpb25zIGluIHJlbGF0aXZlIGh1bWlkaXR5LgoKIVtTZWFzb25hbCByZWxhdGl2ZSBodW1pZGl0eSBpbiBUdWNzb24gKEJlbG1lY2hlcmkgZXQgYWwuIDIwMTggUENFKS4gTm90aWNlIHRoZSBsYXJnZSB2YXJpYXRpb25zIG9uIHRoZSByZWxhdGl2ZSBodW1pZGl0eSBhbmQgIHdlIHdpbGwgcnVuIHRoZSAgZm9sbG93aW5nIG1vZGVsIHRvIHByZWRpY3Qgd2hhdCB0byBleHBlY3QgaW4gdGhlIE94eWdlbiBJc290b3BlcyBpbiB0aGUgY2VsbHVsb3NlIGZvcm1lZCBhbG9uZyB0aGVzZSBzZWFzb25hbCBwcm9ncmVzaW9uXShmaWd1cmVzL0ZJR1VSRTFfUkgucG5nKQoKCiMjIFBBUlQgMTogT3h5Z2VuIGlzb3RvcGVzIGZyb20gdGhlIHNvdXJjZSB3YXRlci4gCgpJbiB0aGlzIGRvY3VtZW50LCB0aGUgInNvdXJjZSB3YXRlciIgd2lsbCBiZSB0aGUgaXNvdG9waWMgcmF0aW8gdGhhdCB0aGUgcGxhbnRzIHRyYW5zcG9ydCB0aHJvdWdoIHRoZSB4eWxlbSB1cCB0byB0aGUgbGVhdmVzLiBUaHVzLCBpdCBpcyB0aGUgc3RhcnRpbmcgcG9pbnQgaW4gd2hpY2ggdGhlIGlzb3RvcGljIGVmZmVjdHMgd2lsbCBiZSByZWNvcmRlZCBkdXJpbmcgYWxsIHRoZSBzdGVwcy4gSGVuY2UsIHRoZSBpbXBvcnRhbmNlIG9mIGhhdmluZyBhIGdvb2QgZXN0aW1hdGlvbiBvciBtZWFzdXJlbWVudCBvZiBpdC4KCmBgYHtyfQoKI3RoZSBpc290b3BpYyB2YWx1ZXMgaW4gZGlmZXJlbnQgbm90YXRpb25zCgpTb3VyY2VfMThPIDwtIC04ICMgVGhpcyB2YWx1ZSAgd2lsbCBiZSBvdXIgc291cmNlIHdhdGVyIGFuZCAgd2lsbCByZW1haW4gY29uc3RhbnQgYXQgLTggcGVybWlsbApyc21vdyA8LSAwLjAwMjAwNTIgIyBPeHlnZW4gSXNvdG9wZSByYXRpbyBmcm9tIFNUQU5EQVJECVNNT1YKUnNvdXJjZT0gcnNtb3cqKDErU291cmNlXzE4Ty8xMDAwKSAjIGNvbnZlcnNpb24gdG8gdGhlIFJhdGlvIHdpdGggbm8gc3RhbmRhcmRpemF0aW9uLgoKIyBFc3RpbWF0aW9uIG9mIHRoZSAgaXNvdG9waWMgdmFsdWUgb2YgdGhlIHdhdGVyIHZhcG9yIGFzdW1pbmcgIGVxdWlsaWJyaXVtIGJldHdlZW4gYXRtb3NwaGVyaWMgdmFwb3IgYW5kIHNvdXJjZSB3YXRlciEgICByZW1lbWJlciB0byBtb2RpZnkgdGhlc2UgdmFsdWVzIHRvIHRoZSB2YXJpYWJpbGl0eSBmb3JtIHRoZSB0ZXh0IGFib3ZlCgojIyMjIyMjIyMjIwp0ZW1wZXJhdHVyZSA8LSBjKDQwLCA0MCwgNDApICMgdGVtcCBpbiBjZWxzaXVzCiMjIyMjIyMjIyMjCgojc3VtbWFyeSBvZiB3aGF0IGlzIGJlbG93ISB3YXRlcl92YXBvciA9IFNvdXJjZSsoaXNvdG9waWMgZWZmZWN0IGZyb20gdGhlIGZhc2UgY2hhbmdlIHVuZGVyIGVxdWlsaWJyaXVtIGFuZCBoYXZlIHRvIGNvbnZlcnQgdGhlIHRlbXBlcmF0dXJlIGluIEthbHZpbiAoMjczLjE1KSwuLi4gc28gd2UgYXJlIG9uIHRvcCBvZiB3aGF0IGlzIGdvaW5nIG9uKQp3YXRlcl92YXBvciA8LVNvdXJjZV8xOE8gKygtMSooMS4xMzcqKDEwMDAwMDAvKCh0ZW1wZXJhdHVyZSsyNzMuMTUpXjIpKS0wLjQxNTYqKCgxMDAwLyh0ZW1wZXJhdHVyZSsyNzMuMTUpKS0yLjA2NjcpKSkgCgojUiBhdG0gIE94eSAgaXNvdG9wZSByYXRpbywgYXRtb3NwaCAgd2F0ZXIgdmFwb3IKUndhdGVyX3ZhcG9yPSByc21vdyooMSt3YXRlcl92YXBvci8xMDAwKQojbm90ZSEgIEkgbmVlZCBoZWxwIG9uIGZpZ3VyaW5nIG91dCB0aGlzIQpgYGAKCiMjIFBBUlQgMjogbGVhZiB3YXRlciBpc290b3BpYyBlbnJpY2htZW50ICAKCk5vdyB0aGF0IHdlIGhhdmUgb3VyIHNvdXJjZSB3YXRlciBhbmQgZXN0aW1hdGUgdGhlIHdhdGVyIHZhcG9yLCB0aGVuLCB3ZSBjYW4gZm9jdXMgb24gd2hhdCB3aWxsIGhhcHBlbiB0byB0aGlzIHdhdGVyIGF0IHRoZSBsZWFmIGR1cmluZyB0cmFuc3BpcmF0aW9uLiAgCgpUaGUgbGVhZiB3YXRlciBpc290b3BpYyBlbnJpY2htZW50IGNhbiBiZSBlc3RpbWF0ZWQgdXNpbmcgdGhlIENyYWlnIEdvcmRvbiBtb2RlbCBvZiBsZWFmIHdhdGVyIGVucmljaG1lbnQuIFRoaXMgaXMgYmVjYXVzZSBpc290b3BlIHZhbHVlcyBpbiB0aGUgd2F0ZXIgaW5zaWRlIHRoZSBsZWFmIGFyZSBleHBvc2VkIHRvIGV2YXBvcmF0aW9uLiBUaGUgaXNvdG9waWMgdmFsdWVzIG9mIHRoZSByZW1pbmRpbmcgd2F0ZXIgaW5zaWRlIHRoZSBsZWFmIHdpbGwgaGF2ZSBhIGRpZmZlcmVudCBpc290b3BpYyB2YWx1ZSBmcm9tIHRoZSBzb3VyY2UgdmFsdWUuIFRoaXMgcHJvY2VzcyB3aWxsIGJlIGhpZ2hseSBkZXBlbmRlbnQgb24gdGhlIHJlbGF0aXZlIGh1bWlkaXR5LCBhbmQgd2UgY2FuIGFwcGx5IHRoZSBDcmFpZyBHb3Jkb24gbW9kZWwgdG8gZXN0aW1hdGUgdGhlIGlzb3RvcGljIHZhbHVlcyBhdCB0aGUgbGVhZiBsZXZlbCB1bmRlciBjZXJ0YWluIHJlbGF0aXZlIGh1bWlkaXR5IHRlbXBlcmF0dXJlcyBhbmQgc3RvbWF0YWwgY29uZHVjdGFuY2UuICAKCmBgYHtyfQojQ29uc3RhbnRzCgojIGJyID0gYm91bmRhcnkgbGF5ZXIgY29uZHVjdGFuY2UuIChtb2wgbS0yIHMtMSkKYnIgPC0xICNjb25zaWRlcmVkIHJlYXNvbmFibGUgdmFsdWUgYmV0d2VlbiAwLjAyIHRvIDMgaW4gUm9kZW4gcGFwZXIgYm91bmRhcnkgbGF5ZXIgcmVzaXN0YW5jZSAgICAKYWsgPC0gMS4wMjg1CSMgYWxwaGFfa2FwcGEsIEtpbmV0aWMgRnJhY3Rpb25hdGlvbiAKYWtiIDwtIDEuMDE4OQkjIGFscGhhX2thcHBhX2JldGEsIEtpbmV0aWMgRnJhY3Rpb25hdGlvbiBib3VuZGFyeSBsYXllcgoKCiMgVmFyaWFibGVzICByZW1lbWJlciB0byBtb2RpZnkgdGhlc2UgdmFsdWVzIHRvIHRoZSB2YXJpYWJpbGl0eSBmb3JtIHRoZSBGaWd1cmUgMQoKIyMjIyMjIyMjIyMKUmVsYXRpdmVfaHVtaWRpdHkgPC0gYygxMDAsIDEwMCwgMTAwKQojIyMjIyMjIyMjIwoKU3RvbWF0YWxfY29uZHVjdGFuY2UgPC0gMC41CmBgYAoKV2UgYWxyZWFkeSBrbm93IHRoYXQgdGhlIHNvdXJjZSB3YXRlciBoYXMgdGhpcyB2YWx1ZXM6CmBgYCB7cn0Kcm91bmQgKFJzb3VyY2UsIGRpZ2l0cyA9IDQpCmBgYAoKV2UgYWxyZWFkeSBrbm93IHRoYXQgdGhlIHdhdGVyIHZhcG9yIGNvdWxkIGJlIGNsb3NlIHRvIGhhcyB0aGlzIHZhbHVlczoKYGBgIHtyfQpyb3VuZChSd2F0ZXJfdmFwb3IsIGRpZ2l0cyA9IDQpCmBgYCAKCmBgYHtyfQojIGEqICAqKmVxdWlsaWJyaXVtIGZyYWN0aW9uYXRpb24gYXQgbGVhZiB0ZW1wZXJhdHVyZSAgCiMgVGhlIGVxdWlsaWJyaXVtIGZyYWN0aW9uYXRpb24gZmFjdG9yLCBhKiBpcyB0ZW1wZXJhdHVyZSBkZXBlbmRlbnQgCiMgKHNlZSBNYWpvdWJlLCAxOTcxLCBKLiBDaGltLiBQaHlzLiA1ODoxNDIzLTE0MzYpCmFscGhhX3N0YXIgPWV4cCgoMS4xMzcqMTAwMC8oMjczLjE1K3RlbXBlcmF0dXJlKV4yKS0oMC40MTU2LygyNzMuMTUrdGVtcGVyYXR1cmUpKS0wLjAwMjA2NjcpCiNSIHNvdXJjZSBPICBpc290b3BlIHJhdGlvLCBzb3VyY2Ugd2F0ZXIKCgojIGJhcm9tZXRyaWMJcHJlc3N1cmUgIChtbWJhcikgIApwcmVzc19iYXIgPC0gNzcgI2EgZ29vZCBzaXRlIGF2ZXJhZ2UgaXMgNzcuNSBhY2NvcmRpbmcgdG8gVywgVGhpcyBuZWVkIHRvIGJlIGNoYW5nZWQgZm9yIHRoZSBwcmVzc3VyZSBsZXZlbApgYGAKCkhlcmUgd2UgYXN1bWUgdGhhdCB0aGUgIHZhcG9yIGlzIHNhdHVyYXRlZCBpbnNpZGUgdGhlIGxlYWYgYW5kIHdlIGFwcGx5IHRoaXMgZm9ybXVsYSB0dSBjYWxjdWxhdGUgdGhlIHZhcG9yIHByZXN1cmUgd2hlbiBzYXR1cmF0ZWQgKFJoPTEwMCUpIGF0IHRoZSB0ZW1wZXJhdHVyZSB3ZSBiZXN0IGVzdGltYXRlIHRoZSBwbGFudCBpcyBhbmQgY2FsbCBpdCAiZWkiLgoKYGBge3J9CgplaSA8LSAoMTAxMzI1KmV4cCgoKCgtMC4xMjk5KigxLSgzNzMuMTYvKDI3My4xNSArIHRlbXBlcmF0dXJlKSkpLTAuNjQ0NSkqKDEtKDM3My4xNi8oMjczLjE1ICsgdGVtcGVyYXR1cmUpKSktMS45NzYpKigxLSgzNzMuMTYvKDI3My4xNSArIHRlbXBlcmF0dXJlKSkpKzEzLjMxODUpKigxLSgzNzMuMTYvKDI3My4xNSArIHRlbXBlcmF0dXJlKSkpKSkvMTAwMAoKI3dpLCAgbGVhZiB3YXRlciB2YXBvciwgY29udmVydGVkIHRvIG1vbGUgZnJhY3Rpb24Kd2k9ZWkvcHJlc3NfYmFyCgojZWEgYW1iaWVudCB2YXBvciBwcmVzc3VyZSAoa1BhKQplYV92IDwtIChSZWxhdGl2ZV9odW1pZGl0eS8xMDApKmVpCgojd2EsIGFtYmllbnQgd2F0ZXIgdmFwb3IsIG1vbGUgZnJhY3Rpb24Kd2Ffdj0gZWFfdi9wcmVzc19iYXIKCiMgVlBEIGluIChrUGEpCnZwZCA9ZWktZWFfdiAKcm91bmQodnBkLCBkaWdpdHM9NCApCmBgYApIZXJlIHdlIGNhbiBzZWUgdGhlIGRpZmZlcmVuY2VzIGluIFZhcG91ciBwcmVzdXJlIGRlZmZpY2l0eSBhbG9uZyB0aGVzZSB0aHJlZSB0aW1lcyBkdXJpbmcgdGhlIGdyb3dpbmcgc2Vhc29uLgpgYGAge3J9CiNUb3RhbCBDb25kdWN0YW5jZSBpbiBtb2wKZyA9IDEvKDEvU3RvbWF0YWxfY29uZHVjdGFuY2UgKyAxL2JyKSAjIG9yIDEvKHJzK3JiKQoKIyBFIGxlYWYgdHJhbnNwaXJhdGlvbiAobW9sIG0tMiBzLTEpICMgYmFyYm91ciAyMDA0CkVfdl9ncyA8LSAod2ktd2FfdikqZwoKI3dzLCBsZWFmIHN1cmZhY2Ugd2F0ZXIgdmFwb3IsIG1vbGUgZnJhYyBSb2RlbiAyMDAwLCBCYWxsICgxOTg3KSwKd3Nfdl9ncyA8LSAoKFN0b21hdGFsX2NvbmR1Y3RhbmNlKndpKS1FX3ZfZ3MqKDEtd2kvMikpLyhTdG9tYXRhbF9jb25kdWN0YW5jZSAtIEVfdl9ncy8yKQoKIyBlcyB2YXBvciBwcmVzc3VyZSBhdCBsZWFmIHN1cmZhY2UgKGtQYSkgaGlnaGVyIHByZXNzdXJlICB0aGFuIHRoZSBhdG1vc3BoZXJlCmVzbF92X2dzIDwtIHdzX3ZfZ3MqcHJlc3NfYmFyCgpyb3VuZChlc2xfdl9ncywgZGlnaXRzID0gMikKcm91bmQoZWFfdiwgZGlnaXRzPTIpCgpgYGAKCkxldHMgcmVjYWxsIHNvbWUgIHZhbHVlcyAgdGhhdCB3ZSBhbHJlYWR5IGhhdmUgZXN0aW1hdGVkIHRoYXQgd2lsbCBiZSAgaW1wb3J0YW50IHRvIGtlZXAgdHJhY2sgYW5kIGVzdGltYXRlIHRoZSBleHBlY3RhdGlvbiBvbiB0aGUgbGVhZiB3YXRlciBlbnJpY2htZW50OgoKYGBgIFJzb3VyY2UgYGBgICBTb3VyY2Ugd2F0ZXIgIApgYGBSd2F0ZXJfdmFwb3JgYGAgaXNvdG9waWMgdmFsdWUgb2YgdGhlIHdhdGVyIHZhcG9yICAgICAKYGBgZWlgYGAgV2F0ZXIgdmFwb3IgcHJlc3VyZSBzYXR1cmF0ZWQgaW5zaWRlIHRoZSBsZWFmICAgIApgYGBlYV92YGBgICBXYXRlciB2YXBvciBwcmVzc3VyZSBhdG1vc3BoZXJlICAKYGBgZXNsX3ZfZ3NgYGAgV2F0ZXIgdmFwb3IgcHJlc3N1cmUgYXQgbGVhZiBzdXJmYWNlICAKCkFuZCBzb21lIGNvbnN0YW50cyAgbGlrZSBhbHBoYV9rYXBwYSwgS2luZXRpYyBGcmFjdGlvbmF0aW9uICBhbmQgYWxwaGFfa2FwcGFfYmV0YSwgS2luZXRpYyBGcmFjdGlvbmF0aW9uIGJvdW5kYXJ5IGxheWVyCmBgYCB7cn0KYWsgPC0gMS4wMjg1CSMgYWxwaGFfa2FwcGEsIEtpbmV0aWMgRnJhY3Rpb25hdGlvbiAKYWtiIDwtIDEuMDE4OQkjIGFscGhhX2thcHBhX2JldGEsIEtpbmV0aWMgRnJhY3Rpb25hdGlvbiBib3VuZGFyeSBsYXllcgoKIyBoZXJlIHdlIGVzdGltYXRlIHRoZSBMZWFmIHdhdGVyIGVucmljaG1lbnQ6ClJsZWFmX3YgPC0gYWxwaGFfc3RhciooKGFrKlJzb3VyY2UgKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGVpLWVzbF92X2dzKS9laSkpKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChha2IqUnNvdXJjZSAqKGVzbF92X2dzLWVhX3YpL2VpKSsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUndhdGVyX3ZhcG9yKmVhX3YvZWkpKQoKIyBSbGVhZl92IG5vdyB0aGUgbGVhZiBxd2F0ZXIgaXMgZXN0aW1hdGVkIGluIHRlcm1zIG9mIFIgIGFuZCB3ZSBtdXN0IGNvbnZlcnQgdGhpcyB2YWx1ZSAgb24gcGVybWlsbCBpbiByc21vdyBPeHlnZW4gSXNvdG9wZSByYXRpbyBmcm9tIFNUQU5EQVJECVNNT1YKIyBSZWNhbGwKcnNtb3cgPC0gMC4wMDIwMDUyCiMgd2Ugc3RhcnRlZCBvbiBhIHZhbHVlICBvZiAtMTAgcGVybWlsIG5vdyBhZnRlciAgdGhlIGV2YXBvcmF0aXZlIGVucmljaG1lbnQgIHRoZSBsZWFmIHdhdGVyIGhhcyBtb3ZlcmQgIGZyb20gLTEwIHRvIDUgcGVybWlsCmxlYWZfd2F0ZXJfMThPIDwtICgoUmxlYWZfdi9yc21vdyktMSkqMTAwMApyb3VuZChsZWFmX3dhdGVyXzE4TywgZGlnaXRzID0gMikKYGBgCgojIyBQQVJUIDM6IGlzb3RvcGljIHNpZ25hbCBpbiB0aGUgQ2VsbHVsb3NlICAKCklzb3RvcGljIGZyYWN0aW9uYXRpb24gZHVyaW5nIHN1Z2FyIHN5bnRoZXNpcyBhbmQgbWl4aW5nIGR1cmluZyBjZWxsdWxvc2Ugc3ludGhlc2lzLiAKCk5vdywgYWZ0ZXIgd2Uga25vdyB0aGUgd2F0ZXIgd2hlcmUgdGhlIHN1Z2FycyBhcmUgbWFkZSBhbmQgdHJhbnNwb3J0ZWQgaW4gdGhlIHBobG9lbSwgd2UgY2FuIHVzZSB0aGUgbGVhZiB3YXRlciBhbmQgdGhlIFNvdXJjZV8xOE8gdG8gZXN0aW1hdGUgdGhlIHJlc3VsdCBvbiB0aGUgY2VsbHVsb3NlLCB0YWtlIGludG8gY29uc2lkZXJhdGlvbiB0aGF0IGR1cmluZyBjZWxsdWxvc2Ugc3ludGhlc2lzLCB0aGUgc291cmNlIHdhdGVyIHdpbGwgaGF2ZSBzb21lIGluZmx1ZW5jZSBvbiB0aGUgcmVzdWx0LCBhbmQgd2UgdXN1YWxseSB1c2UgYSA0MiBwZXJjZW50IGV4Y2hhbmdlLgoKCmBgYHtyfQojIE5vdyAgIGFmdGVyIHdlIGtub3cgdGhlICB3YXRlciB3aGVyZSB0aGUgc3VnYXJzIGFyZSBtYWRlIGFuZCB0cmFzcG9ydGVkIGluIHRoZSBmbG9lbSAgd2UgY2FuIHVzZSB0aGUgbGVhZiB3YXRlciBhbmQgdGhlIFNvdXJjZV8xOE8gdG8gZXN0aW1hdGUgdGhlIGVuZCByZXN1bHQgb24gdGhlIGNlbGx1bG9zZSwgdGFrZSBpbiBjb25zaWRlcmF0aW9uIHRoYXQgZHVyaW5nICBjZWxsdWxvc2Ugc2ludGhlc2lzaSAgdGhlIHNvdXJjZSB3YXRlciB3aWxsIGhhdmUgc29tZSBpbmZsdWVuY2Ugb24gdGhlIGVuZCByZXN1bHQuIGFuZCB3ZSB1c3VhbHkgdXNlIGEgNDIgcGVyY2VudCBleGNoYW5nZQojIGFuZCBzb21lIGNvbnN0YW50cwoKZXBzaWxvbl9zIDwtICAyNyAjQXV0b3Ryb3BoaWMgZnJhY3Rpb25hdGlvbiBTdWNyb3NlCQplcHNpbG9uX2MgPC0gMjcJIyBBdXRvdHJvcGhpYyBmcmFjdGlvbmF0aW9uIENlbGx1bG9zZSAjIyAwLjAwODQqVG1pbi50c14yLTAuNTEqVG1pbi50cysgMzMuMTcyIApGXzAgPC0gMC40MiAjIHByb3BvcnRpb24gb2Ygc291cmNlIHdhdGVyIHVzZWQgZHVyaW5nIGNlbGx1bG9zZSBzaW50aGVzeXMKCmNlbGx1bG9zZV9kMThPPSBGXzAqKFNvdXJjZV8xOE8gKyBlcHNpbG9uX2MpICsgKDEgLSBGXzApICogKGxlYWZfd2F0ZXJfMThPKyBlcHNpbG9uX3MpIAoKYGBgCgojIyBQQVJUIDQ6IENvbXBhcmlzb24gYmV0d2VlbiBtb2RlbGVkIGRhdGEgYW5kIG9ic2VydmF0aW9ucwoKIVtNZWNoYW5pc3RpYyBtb2RlbGluZyBvZiB0cmVl4oCQcmluZyBjZWxsdWxvc2UgzrQxOE8gYW5kIGxlYWYgd2F0ZXIgZW5yaWNobWVudCDOlEwsIGFuZCB0aGVpciBzZW5zaXRpdml0aWVzIHRvIHJlbGF0aXZlIGh1bWlkaXR5LiAoYSkgVGhlIENyYWln4oCTR29yZG9uIG1vZGVsIChDRykgb3V0cHV0cyBhcmUgcGxvdHRlZCBmcm9tIE1heSB0byBEZWNlbWJlciwgdGhlIHBlcmlvZCBjb3JyZXNwb25kaW5nIHRvIGNlbGwgd2FsbCB0aGlja2VuaW5nIGZvciBhbGwgdHJlZeKAkHJpbmcgc3ViZGl2aXNpb25zLiBUaGUgeWVsbG93IGNvbG9yIGxpbmVzIGNvcnJlc3BvbmQgdG8gdGhlIENHIHNpbXVsYXRpb25zIG9mIM60MThPIGNlbGx1bG9zZSB3aXRoaW4gdGhlIHJhbmdlIG9mIHRoZSBwcm9wb3J0aW9uIG9mIGV4Y2hhbmdlYWJsZSBveHlnZW4gaW4gY2VsbHVsb3NlIChQZXgpIHZhcmlhYmlsaXR5IGZyb20gMC4xICh0aGluIGxpbmUpIHRvIDAuNyAodGhpY2sgbGluZSkuIFRoZSBncmF5IGhvcml6b250YWwgYmFycyBjb3JyZXNwb25kIHRvIHRoZSBjZWxsIHdhbGwgdGhpY2tlbmluZyAob3IgY2VsbOKAkG1hdHVyYXRpb24pIHBlcmlvZCBmb3IgZWFjaCBzdWJkaXZpc2lvbiBhbmQgYXJlIHBsb3R0ZWQgb24gdGhlIG1lYW4gb2YgdGhlIM60MThPIG1lYXN1cmVtZW50cy4gVGhlIGNlbGwgd2FsbCB0aGlja2VuaW5nIHBoYXNlIHdhcyBkZXJpdmVkIGZyb20gbWljcm9zY29waWMgcGhlbm9sb2dpY2FsIG9ic2VydmF0aW9ucyBmcm9tIE1vcmlubyBhbmQgSHVnaGVzIChVbml2ZXJzaXR5IG9mIEFyaXpvbmEsIHVucHVibGlzaGVkIG9ic2VydmF0aW9ucywgVGFibGUgUzMpLiBUaGUgY2xpbWF0ZSBkcml2ZXJzIHVzZWQgaW4gdGhlIENHIG1vZGVsIHRvIG1ha2UgzrQxOE9jZWwgcHJlZGljdGlvbnMgd2VyZSBkZXJpdmVkIGZyb20gUFJJU00gZGF0YTsgKGIpIHNlYXNvbmFsIGN5Y2xlIG9mIHRoZSBDRyBtZWFuIGxlYWYgd2F0ZXIgZW5yaWNobWVudCAozpRMKS4gVGhlIHNoYWRlZCBncmF5IGNvbG9yIGNvcnJlc3BvbmRzIHRvIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgbW9kZWxsZWQgzpRMLiBUaGUgZGFzaGVkIGJsdWUgbGluZSBpbiAoYSkgYW5kIChiKSBpbmRpY2F0ZXMgdGhlIGF2ZXJhZ2UgZGF0ZSBvZiB0aGUgbW9uc29vbiBvbnNldDsgKGMpIG1vZGVsbGVkIM6UTCBwbG90dGVkIHZlcnN1cyByZWxhdGl2ZSBodW1pZGl0eSAoUkgpIGluICUgY2FsY3VsYXRlZCBhdCBiaW1vbnRobHkgcmVzb2x1dGlvbi4gVGhlIM6UTCBzaW11bGF0aW9ucyB3ZXJlIHJ1biB1c2luZyBtZWFuLCBtaW5pbXVtLCBhbmQgbWF4aW11bSBSSC4gVGhlIHJhbmdlIG9mIFJIIGZvciB0aGUgaHlwZXLigJBhcmlkIHBlcmlvZCBvZiBNYXkgYW5kIEp1bmUgYXJlIHBsb3R0ZWQgaW4gb3JhbmdlIGNpcmNsZXMuIFRoZSBkYXJrIGJsdWUgY2lyY2xlcyByZXByZXNlbnQgUkggcmFuZ2Ugb2JzZXJ2ZWQgZm9yIHRoZSBtb25zb29uIHNlYXNvbiAoSnVseeKAk0F1Z3VzdCkuIFRoZSBncmF5IGNpcmNsZXMgY29ycmVzcG9uZCB0byB0aGUgcmFuZ2Ugb2YgUkggb2JzZXJ2ZWQgZnJvbSBTZXB0ZW1iZXIgdG8gQXByaWwgKEJlbG1lY2hlcmkgZXQgYWwuIDIwMTggUENFKV0oZmlndXJlcy9GSUdVUkU2LnBuZykKCnlvdXIgZXN0aW1hdGlvbnMgZm9yIHRoZSBjYWxsdWxvc2Ugb3h5Z2VuIElzb3RvcGVzIGFyZToKYGBge3J9CnJvdW5kKGNlbGx1bG9zZV9kMThPLCBkaWdpdHMgPSAyKQpgYGAKeW91ciBlc3RpbWF0aW9ucyBmb3IgdGhlIGxlYWYgd2F0ZXIgb3h5Z2VuIElzb3RvcGVzIGFyZToKYGBge3J9CnJvdW5kKGxlYWZfd2F0ZXJfMThPLCBkaWdpdHMgPSAyKQpgYGAKCiMjIyAgQ29tcGFyaXNvbiBiZXR3ZWVuIG1vZGVsZWQgZGF0YSBhbmQgb2JzZXJ2YXRpb25zLCAKTm93IHdpdGggdGhlc2UgdmFsdWVzIHRoYXQgeW91IGNvbWFyZWQgIHdyaXRlIGRvd24geW91ciBvYnNlcnZhdGlvbnMgZGlmZmVyZW5jZXMgYW5kICBzaW1pbGFyaXRpZXMgYmV0d2VlbiAgdGhlIG1vZGVsZWQgZGF0YSBpbiB0aGlzIGV4Y2Vyc2lzZSBhbmQgdGhlIG1lYXN1cmVtZW50cyBzaG93biBpbiB0aGUgZmlndXJlIDIgYWJvdmUuICAKCkhvdyBkbyB5b3UgdGhpbmsgdGhpcyB0b29sIGlzIHVzZWZ1bD8KCldoYXQgYXJlIHRoZSBjb25zdHJhaW5zIG9yIGRpZmZpY3VsdGllcyBvbiBpbXBsZWVudGluZyB0aGlzIG1vZGVsIGZvciByZWxpYWJsZSBhbmFseXNpcz8KCgpHb29kIGx1Y2shCgoKCgoKCgoKCgo=